package com.yichang.comisiones.dao.impl;

import com.yichang.comisiones.dao.UsuarioDao;
import com.yichang.comisiones.dto.UsuarioDTO;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;
import org.springframework.stereotype.Repository;

/**
 *
 * @author gian
 */
@Repository
public class UsuarioDaoImpl extends SimpleJdbcDaoSupport implements UsuarioDao {

    private static Logger log = LoggerFactory.getLogger(UsuarioDaoImpl.class);

    @Autowired
    public UsuarioDaoImpl(DataSource dataSource) {
        log.info("Asignando el dataSource");
        setDataSource(dataSource);
    }

    @Override
    public Integer insertar(UsuarioDTO usuario) {

        if (!usuario.getEmpleado().getIdEmpleado().isEmpty()) {
            return getJdbcTemplate().update(
                    "insert into usuarios (tvv1t_codi,correo,password) values (?, ?, ?)",
                    usuario.getEmpleado().getIdEmpleado(), usuario.getCorreo(), usuario.getPassword());            
        } else {
            return getJdbcTemplate().update(
                    "insert into usuarios (correo,password) values (?, ?)",
                    usuario.getCorreo(), usuario.getPassword());
        }
    }

    @Override
    public void actualizar(UsuarioDTO usuario) {
        getJdbcTemplate().update(
                "update usuarios set tvv1t_codi = ?, correo = ?, active = ? where id = ?",
                usuario.getEmpleado().getIdEmpleado(),usuario.getCorreo(),usuario.getActive(),usuario.getId());
    }

    @Override
    public void eliminar(UsuarioDTO usuario) {
        getJdbcTemplate().update(
                "delete from usuarios where id = ?", usuario.getId());
    }

    @Override
    public UsuarioDTO buscar(Integer id) {
        try {
            
            StringBuilder sql = new StringBuilder();

            sql.append("select ");
            sql.append("u.id, ");
            sql.append("t0.empleadoId, ");
            sql.append("t0.empleadoNombre, ");
            sql.append("u.password, ");
            sql.append("u.active, ");
            sql.append("u.correo ");
            sql.append("from( ");
            sql.append("select ");
            sql.append("e.tvv1t_codi empleadoId, ");
            sql.append("LTRIM(RTRIM(case when charindex(LTRIM(RTRIM(e.tvv1t_codi)),e.tvv1t_desc)>0 then REPLACE(e.tvv1t_desc, LTRIM(RTRIM(e.tvv1t_codi)),'') ");
            sql.append("else tvv1t_desc end)) empleadoNombre ");
            sql.append("from tvv1t e  ");
            sql.append("where ");            
            sql.append(" tvv1t_flgcomi = 'S' ");
            sql.append(" and len(e.tvv1t_codi)=3 ");
            sql.append(" and e.tvv1t_codi != e.tvv1t_desc ");
            sql.append(" )t0  ");
            sql.append(" full join usuarios u on t0.empleadoId = u.tvv1t_codi ");
            sql.append(" where u.id = ? ");
            sql.append(" order by 2, 1;   ");                       
            
            return getSimpleJdbcTemplate().queryForObject(sql.toString(),
                    new BeanPropertyRowMapper<UsuarioDTO>(UsuarioDTO.class), id);
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    }
    
    @Override
    public UsuarioDTO buscarPorCodigo(String codigo) {
        try {
            
            StringBuilder sql = new StringBuilder();

            sql.append("select ");
            sql.append("u.id, ");
            sql.append("e.tvv1t_codi empleadoId, ");
            sql.append("LTRIM(RTRIM(case when charindex(LTRIM(RTRIM(e.tvv1t_codi)),e.tvv1t_desc)>0 then REPLACE(e.tvv1t_desc, LTRIM(RTRIM(e.tvv1t_codi)),'')  ");
            sql.append(" else tvv1t_desc end)) empleadoNombre, ");
            sql.append("u.password, ");
            sql.append("u.active, ");
            sql.append("u.correo ");
            sql.append(" from tvv1t e inner join usuarios u on e.tvv1t_codi = u.tvv1t_codi ");
            sql.append(" where ");
            sql.append(" u.tvv1t_codi = ? ");
            sql.append(" and tvv1t_flgcomi = 'S' ");
            sql.append(" and len(e.tvv1t_codi)=3 ");
            sql.append(" and e.tvv1t_codi != e.tvv1t_desc ");
            sql.append(" order by 2, 1; ");            
            
            return getSimpleJdbcTemplate().queryForObject(sql.toString(),
                    new BeanPropertyRowMapper<UsuarioDTO>(UsuarioDTO.class), codigo);
        } catch (EmptyResultDataAccessException e) {
            return null;
        } catch (IncorrectResultSizeDataAccessException irs) {
            return null;
        }
    }

    @Override
    public List<UsuarioDTO> buscarTodos(boolean admin) {
        
        StringBuilder sql = new StringBuilder();
        
        if (admin) {
            sql.append("select ");
            sql.append("u.id, ");
            sql.append("null, ");
            sql.append("null, ");
            sql.append("u.password, ");
            sql.append("u.active, ");
            sql.append("u.correo ");
            sql.append("from usuarios u where u.tvv1t_codi is null or ltriM(rtrim(u.tvv1t_codi)) = '' ");
            sql.append("order by 2, 1;   ");
        } else {        
            sql.append("select ");
            sql.append("u.id, ");
            sql.append("t0.empleadoId, ");
            sql.append("t0.empleadoNombre, ");
            sql.append("u.password, ");
            sql.append("u.active, ");
            sql.append("u.correo ");
            sql.append("from( ");
            sql.append("select ");
            sql.append("e.tvv1t_codi empleadoId, ");
            sql.append("LTRIM(RTRIM(case when charindex(LTRIM(RTRIM(e.tvv1t_codi)),e.tvv1t_desc)>0 then REPLACE(e.tvv1t_desc, LTRIM(RTRIM(e.tvv1t_codi)),'') ");
            sql.append("else tvv1t_desc end)) empleadoNombre ");
            sql.append("from tvv1t e  ");
            sql.append("where ");
            sql.append("tvv1t_flgcomi = 'S' ");
            sql.append("and len(e.tvv1t_codi)=3 ");
            sql.append("and e.tvv1t_codi != e.tvv1t_desc ");
            sql.append(")t0  ");
            sql.append("inner join usuarios u on t0.empleadoId = u.tvv1t_codi ");
            sql.append("order by 2, 1;   ");
        }
        
        return getSimpleJdbcTemplate().query(sql.toString(),
                new BeanPropertyRowMapper<UsuarioDTO>(UsuarioDTO.class));
    }

    @Override
    public List<UsuarioDTO> buscarPorNombre(String nombre) {
        try {
            Map<String,String> parametros = new HashMap<String,String>();
            parametros.put("nombre","%"+nombre+"%");
            
            StringBuilder sql = new StringBuilder();            
            sql.append("select ");
            sql.append("u.id, ");
            sql.append("t0.empleadoId, ");
            sql.append("t0.empleadoNombre, ");
            sql.append("u.password, ");
            sql.append("u.active, ");
            sql.append("u.correo ");
            sql.append("from( ");
            sql.append("select ");
            sql.append("e.tvv1t_codi empleadoId, ");
            sql.append("LTRIM(RTRIM(case when charindex(LTRIM(RTRIM(e.tvv1t_codi)),e.tvv1t_desc)>0 then REPLACE(e.tvv1t_desc, LTRIM(RTRIM(e.tvv1t_codi)),'') ");
            sql.append("else tvv1t_desc end)) empleadoNombre ");
            sql.append("from tvv1t e  ");
            sql.append("where ");
            sql.append("tvv1t_flgcomi = 'S' ");
            sql.append("and len(e.tvv1t_codi)=3 ");
            sql.append("and e.tvv1t_codi != e.tvv1t_desc ");
            sql.append(")t0  ");
            sql.append("full join usuarios u on t0.empleadoId = u.tvv1t_codi ");
            sql.append(" where ");
            sql.append(" t0.empleadoNombre like :nombre ");
            sql.append("order by 2, 1;   ");            
            
            return getSimpleJdbcTemplate().query(sql.toString(),
                    new BeanPropertyRowMapper<UsuarioDTO>(UsuarioDTO.class),parametros);
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    }
    
    @Override
    public UsuarioDTO buscarPorCorreo(String correo) {
        try {
            Map<String,String> parametros = new HashMap<String,String>();
            parametros.put("correo","%"+correo+"%");
            
            StringBuilder sql = new StringBuilder();
            
            sql.append("select ");
            sql.append("u.id, ");
            sql.append("t0.empleadoId, ");
            sql.append("t0.empleadoNombre, ");
            sql.append("u.password, ");
            sql.append("u.active, ");
            sql.append("u.correo ");
            sql.append("from( ");
            sql.append("select ");
            sql.append("e.tvv1t_codi empleadoId, ");
            sql.append("LTRIM(RTRIM(case when charindex(LTRIM(RTRIM(e.tvv1t_codi)),e.tvv1t_desc)>0 then REPLACE(e.tvv1t_desc, LTRIM(RTRIM(e.tvv1t_codi)),'') ");
            sql.append("else tvv1t_desc end)) empleadoNombre ");
            sql.append("from tvv1t e  ");
            sql.append("where ");
            sql.append(" tvv1t_flgcomi = 'S' ");
            sql.append("and len(e.tvv1t_codi)=3 ");
            sql.append("and e.tvv1t_codi != e.tvv1t_desc ");
            sql.append(")t0  ");
            sql.append("full join usuarios u on t0.empleadoId = u.tvv1t_codi ");
            sql.append(" where ");
            sql.append(" u.correo like :correo ");            
            sql.append("order by 2, 1;   ");            
            
            return getSimpleJdbcTemplate().queryForObject(sql.toString(),
                    new BeanPropertyRowMapper<UsuarioDTO>(UsuarioDTO.class),parametros);
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    }    
    
    @Override
    public void changePassword(Integer userId, String newPassword) {
        try {
            getJdbcTemplate().update(
                    "update usuarios set password = ? where id = ?",
                    newPassword,userId);            
        } catch (Exception e) {
            log.error(e.getMessage());
        }
    }
}